package com.esri.geoevent.solutions.processor.geometry;
/*
* #%L
* Esri :: AGES :: Solutions :: Processor :: Geometry
* $Id:$
* $HeadURL:$
* %%
* Copyright (C) 2013 - 2014 Esri
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import com.esri.core.geometry.GeometryEngine;
import com.esri.core.geometry.MapGeometry;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.Polygon;
import com.esri.core.geometry.SpatialReference;
import com.esri.ges.core.component.ComponentException;
import com.esri.ges.core.geoevent.GeoEvent;
import com.esri.ges.processor.GeoEventProcessorBase;
import com.esri.ges.processor.GeoEventProcessorDefinition;
import com.esri.ges.spatial.GeometryException;
import com.esri.ges.spatial.Spatial;
public class PolygonProcessor extends GeoEventProcessorBase {
Spatial spatial;
private static final Log LOG = LogFactory.getLog(PolygonProcessor.class);
private SpatialReference srIn;
private SpatialReference srBuffer;
private SpatialReference srOut;
public PolygonProcessor(GeoEventProcessorDefinition definition, Spatial s)
throws ComponentException {
super(definition);
spatial = s;
geoEventMutator= true;
}
@Override
public GeoEvent process(GeoEvent evt){
try {
int inwkid = (Integer) properties.get("wkidin").getValue();
int outwkid = (Integer) properties.get("wkidout").getValue();
//int bufferwkid = (Integer) properties.get("wkidbuffer").getValue();
srIn = SpatialReference.create(inwkid);
//srBuffer = SpatialReference.create(bufferwkid);
srOut = SpatialReference.create(outwkid);
String eventfld = properties.get("polyfld").getValue().toString();
String[] arr = eventfld.split(":");
String geostring = (String) evt.getField(arr[1]);
String format = properties.get("polyformat").getValue().toString();
com.esri.ges.spatial.Geometry geo = null;
if (format.equals("Json")) {
geo = constructJsonGeometry(geostring);
} else if (format.equals("CAP")) {
geo = constructCAPGeometry(geostring);
}
evt.setGeometry(geo);
return evt;
} catch (Exception ex) {
LOG.error(ex.getMessage());
LOG.error(ex.getStackTrace());
return null;
}
}
private com.esri.ges.spatial.Geometry constructJsonGeometry(String jsongeo) {
try {
String jsonOut = jsongeo;
JsonFactory jf = new JsonFactory();
JsonParser json = jf.createJsonParser(jsongeo);
MapGeometry mgeo = GeometryEngine.jsonToGeometry(json);
if (!mgeo.getSpatialReference().equals(srOut)) {
com.esri.core.geometry.Geometry geo = mgeo.getGeometry();
com.esri.core.geometry.Geometry projGeo = GeometryEngine
.project(geo, srIn, srOut);
jsonOut = GeometryEngine.geometryToJson(srOut, projGeo);
}
return spatial.fromJson(jsonOut);
} catch (JsonParseException ex) {
LOG.error("Unable to parse json");
LOG.error(ex.getMessage());
LOG.error(ex.getStackTrace());
return null;
} catch (IOException ex) {
LOG.error(ex.getMessage());
LOG.error(ex.getStackTrace());
return null;
} catch (GeometryException ex) {
LOG.error(ex.getMessage());
LOG.error(ex.getStackTrace());
return null;
}
}
private com.esri.ges.spatial.Geometry constructCAPGeometry(String geoString)
throws GeometryException {
try {
String[] pairs = geoString.split(" ");
Polygon polygon = new Polygon();
Boolean firstit = true;
for (String coords : pairs) {
String[] tuple = coords.split(",");
Double x = Double.parseDouble(tuple[0]);
Double y = Double.parseDouble(tuple[1]);
Point p = new Point(x, y);
Double z = Double.NaN;
if (tuple.length > 2) {
z = Double.parseDouble(tuple[2]);
p.setZ(z);
}
if (firstit) {
polygon.startPath(p);
firstit = false;
} else {
polygon.lineTo(p);
}
}
polygon.closeAllPaths();
String json = GeometryEngine.geometryToJson(srIn, polygon);
return spatial.fromJson(json);
} catch (GeometryException ex) {
LOG.error(ex.getMessage());
LOG.error(ex.getStackTrace());
return null;
}
}
}